/*
 * Copyright (c) 2023, LXMS (lxinet.cn).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.lxinet.lxms.system.service;

import cn.lxinet.lxms.framework.mybatis.service.SimpleService;
import cn.lxinet.lxms.system.entity.SysPost;
import cn.lxinet.lxms.system.entity.SysUserPost;
import cn.lxinet.lxms.system.mapper.SysUserPostMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 用户与岗位关联表
 *
 * @author zcx
 * @date 2023/07/08
 */
@Slf4j
@Service
public class SysUserPostService extends SimpleService<SysUserPost> {

    @Autowired
    private SysUserPostMapper sysUserPostMapper;
    @Autowired
    private SysPostService sysPostService;

    public void batchSave(Long userId, List<Long> postIdList){
        if (postIdList == null || postIdList.isEmpty()){
            return;
        }
        //查询存在的岗位，不存在的岗位不做关联关系
        List<SysPost> postList = sysPostService.listByIds(postIdList);
        postIdList = postList.stream().map(p -> p.getId()).toList();
        List<SysUserPost> list = new ArrayList<>();
        postIdList.forEach(postId -> list.add(new SysUserPost(userId, postId)));
        batchInsert(list);
    }

    public void batchUpdate(Long userId, List<Long> postIdList){
        if (postIdList == null){
            postIdList = new ArrayList<>();
        }
        Set<Long> dbPostIds = sysUserPostMapper.listPostIdsByUserId(userId);
        //需要删除的数据
        Set<Long> delList = new HashSet<>(dbPostIds);
        delList.removeAll(postIdList);
        //需要添加的数据
        Set<Long> addList = new HashSet<>(postIdList);
        addList.removeAll(dbPostIds);
        //正常每个人岗位不多，遍历删除，如果岗位数据会很大，最好改成批量删除
        delList.forEach(postId -> sysUserPostMapper.deleteByUserIdAndPostId(userId, postId));
        if (!addList.isEmpty()){
            List<SysUserPost> addUserPostList = new ArrayList<>();
            addList.forEach(postId -> addUserPostList.add(new SysUserPost(userId, postId)));
            batchInsert(addUserPostList);
        }
    }

    public void delete(Long id){
        super.deleteById(id);
    }

    public List<Long> listPostIdsByUserId(Long userId){
        Set<Long> postIds = sysUserPostMapper.listPostIdsByUserId(userId);
        return postIds.stream().toList();
    }
}